from PIL import Image
import os

'''
def create_gif_from_folder(folder_path, output_gif, frame_duration=100, max_size=6000):
    """
    将文件夹中的所有 .png 图片组合成一张适合微信查看的 GIF 动态图

    :param folder_path: 包含 .png 图片的文件夹路径
    :param output_gif: 输出的 GIF 文件路径
    :param frame_duration: 每帧的持续时间（毫秒）
    :param max_size: 图片的最大宽度或高度（像素），用于控制分辨率
    """
    # 获取文件夹中所有的 .png 文件，并按文件名排序
    png_files = sorted([f for f in os.listdir(folder_path) if f.endswith('BSSR.png')], 
                       key=lambda x: int(x.split('#')[0]))

    # 打开所有图片并存储在列表中
    images = []
    for png_file in png_files:
        img_path = os.path.join(folder_path, png_file)
        img = Image.open(img_path)

        # 调整图片大小，确保不超过最大尺寸
        if max(img.width, img.height) > max_size:
            img.thumbnail((max_size, max_size), Image.Resampling.LANCZOS)

        # 将图片转换为 RGB 模式
        #img = img.convert("RGBA")
        images.append(img)

    # 保存为适合微信查看的 GIF
    images[0].save(
        output_gif,
        save_all=True,
        append_images=images[1:],
        duration=frame_duration,
        loop=0,
        compress_level=1,  # 启用压缩
        disposal=2,  # 每帧独立播放
        optimize=True,  # 启用优化
        transparency=0  # 保留透明度（如果有）
    )

    print(f"GIF 已成功保存到 {output_gif}")
'''

def create_gif_from_folder(folder_path, output_gif, frame_duration=100, max_size=6000):
    """
    将文件夹中的所有 .png 图片组合成 GIF，透明部分填充为白色背景

    :param folder_path: 包含 .png 图片的文件夹路径
    :param output_gif: 输出的 GIF 文件路径
    :param frame_duration: 每帧的持续时间（毫秒）
    :param max_size: 图片的最大宽度或高度（像素），用于控制分辨率
    """
    # 获取文件夹中所有的 .png 文件，并按文件名排序
    png_files = sorted([f for f in os.listdir(folder_path) if f.endswith('BSSR.png')], 
                       key=lambda x: int(x.split('#')[0]))

    # 打开所有图片并转换透明区域为白色
    images = []
    for png_file in png_files:
        img_path = os.path.join(folder_path, png_file)
        img = Image.open(img_path)

        # 调整图片大小，确保不超过最大尺寸
        if max(img.width, img.height) > max_size:
            img.thumbnail((max_size, max_size), Image.Resampling.LANCZOS)

        # 如果有透明通道，转换为 RGB 并填充白色背景
        if img.mode in ('RGBA', 'LA'):
            background = Image.new('RGB', img.size, (255, 255, 255))
            background.paste(img, mask=img.split()[-1])  # 使用 alpha 通道作为掩码
            img = background
        else:
            img = img.convert('RGB')

        images.append(img)

    # 保存为 GIF
    if images:
        images[0].save(
            output_gif,
            save_all=True,
            append_images=images[1:],
            duration=frame_duration,
            loop=0,
            optimize=True,
            compress_level=1
        )
        print(f"GIF 已成功保存到 {output_gif}")
    else:
        print("没有找到任何图片文件！")

if __name__ == "__main__":
    # 示例用法
    folder_path = "/home/hpc/program/IDEALS3D/Share/G47800/Model/DDPM-0.15-50000epoch/Optimize/J翼柱装药_epoch30000c5w0.5/1"  # 替换为你的文件夹路径
    output_gif = f"{folder_path}/output.gif"  # 输出的 GIF 文件名
    frame_duration = 200  # 每帧的持续时间（毫秒）

    create_gif_from_folder(folder_path, output_gif, frame_duration)